//=======================================================================
//文件名称：common.h
//功能概要：公共要素软件构件头文件
//版权所有：江苏电子-索明何
//版本更新：2023-03-12  V1.2
//=======================================================================
#ifndef  _COMMON_H                //防止重复定义（开头）
#define  _COMMON_H

//1.包含MCU芯片头文件
#include  "stm32f10x.h"           //MCU芯片头文件
#include  "system_stm32f10x.h"    //MCU芯片系统初始化头文件

//2.宏定义芯片使用的时钟频率（依据\03_MCU\system_stm32f10x.c文件中的说明）
#define  SYSTEM_CLK_HZ    (SystemCoreClock)      //系统时钟频率(64000000Hz)
#define  SYSTEM_CLK_KHZ   (SYSTEM_CLK_HZ/1000)   //系统时钟频率(64000kHz)
#define  SYSTEM_CLK_MHZ   (SYSTEM_CLK_KHZ/1000)  //系统时钟频率(64MHz)

#define  AHB_CLK_HZ       SYSTEM_CLK_HZ          //AHB总线时钟频率(64000000Hz)
#define  AHB_CLK_KHZ      (AHB_CLK_HZ/1000)      //AHB总线时钟频率(64000kHz)
#define  AHB_CLK_MHZ      (AHB_CLK_KHZ/1000)     //AHB总线时钟频率(64MHz)

#define  CORE_CLK_HZ      AHB_CLK_HZ             //内核时钟频率(64000000Hz)
#define  CORE_CLK_KHZ     (CORE_CLK_HZ/1000)     //内核时钟频率(64000kHz)
#define  CORE_CLK_MHZ     (CORE_CLK_KHZ/1000)    //内核时钟频率(64MHz)

#define  APB1_CLK_HZ      (AHB_CLK_HZ/2)         //APB1总线（低速APB）时钟频率(32000000Hz)
#define  APB1_CLK_KHZ     (APB1_CLK_HZ/1000)     //APB1总线（低速APB）时钟频率(32000kHz)
#define  APB1_CLK_MHZ     (APB1_CLK_KHZ/1000)    //APB1总线（低速APB）时钟频率(32MHz)

#define  APB2_CLK_HZ      (AHB_CLK_HZ/1)         //APB2总线（高速APB）时钟频率(64000000Hz)
#define  APB2_CLK_KHZ     (APB2_CLK_HZ/1000)     //APB2总线（高速APB）时钟频率(64000kHz)
#define  APB2_CLK_MHZ     (APB2_CLK_KHZ/1000)    //APB2总线（高速APB）时钟频率(64MHz)

//3.宏定义开、关总中断
#define  ENABLE_INTERRUPTS   __ASM("CPSIE i")   //开总中断
#define  DISABLE_INTERRUPTS  __ASM("CPSID i")   //关总中断

//4.宏定义位操作函数
#define  BSET(R,bit)   ((R)|= (1<<(bit)))    //将寄存器R的第bit位置1
#define  BCLR(R,bit)   ((R) &= ~(1<<(bit)))  //将寄存器R的第bit位清0 
#define  BGET(R,bit)   (((R) >> (bit)) & 1)  //获取寄存器R的第bit位的值
#define  BRVS(R,bit)   ((R)^= (1<<(bit)))    //将寄存器R的第bit位取反

//5.声明基本数据类型别名
typedef  unsigned char           uint8;   //无符号8位整型或字符型
typedef  unsigned short int      uint16;  //无符号16位整型
typedef  unsigned int            uint32;  //无符号32位整型
typedef  unsigned long long int  uint64;  //无符号64位整型
typedef  signed char             int8;    //有符号8位整型
typedef  signed short int        int16;   //有符号16位整型
typedef  signed int              int32;   //有符号32位整型
typedef  long  long int          int64;   //有符号64位整型
//不优化类型
typedef  volatile uint8          vuint8;  //不优化无符号8位整型或字符型
typedef  volatile uint16         vuint16; //不优化无符号16位整型
typedef  volatile uint32         vuint32; //不优化无符号32位整型
typedef  volatile uint64         vuint64; //不优化无符号64位整型
typedef  volatile int8           vint8;   //不优化有符号8位整型
typedef  volatile int16          vint16;  //不优化有符号16位整型
typedef  volatile int32          vint32;  //不优化有符号32位整型
typedef  volatile int64          vint64;  //不优化有符号64位整型

//6.包含库函数头文件
#include  "math.h"                        //包含数学库函数头文件

//7.对外接口函数声明
//=======================================================================
//函数名称：Delay_us
//函数功能：延时（微秒级）
//函数参数：t_us: 延时的微秒数（1~65535）
//函数返回：无
//函数调用示例：
//   Delay_us(500);            //延时500us
//=======================================================================
void Delay_us(uint16 t_us);

//=======================================================================
//函数名称：Delay_ms
//函数功能：延时（毫秒级）
//函数参数：t_ms: 延时的毫秒数（1~65535）
//函数返回：无
//函数调用示例：
//   Delay_ms(500);            //延时500ms
//=======================================================================
void Delay_ms(uint16 t_ms);

//=======================================================================
//函数名称：SecAdd1
//函数功能：每经过1s，秒值+1，并更新实参数组中的时分秒值（00:00:00~23:59:59）
//函数参数：b[ ]: 用于接收存放时分秒值的实参数组的首地址（可用实参数组名作为函数实参）
//函数返回：无
//函数调用示例：
//   SecAdd1(a);              //更新实参数组a中的时分秒值
//=======================================================================
void SecAdd1(uint8 b[ ]);

//=======================================================================
//函数名称：int_digit
//函数功能：计算非负整数的位数
//函数参数：num: 待求位数的非负整数
//函数返回：非负整数的位数
//函数调用示例：
//    int_digit(1234);        //计算并得到整数1234的位数4
//=======================================================================
uint8 int_digit(uint32 num);

//======================================================================
//函数名称：MPSort
//函数功能：冒泡法排序（由小到大）
//函数参数：b[ ]: 用于接收实参数组的首地址（可用实参数组名作为函数实参）
//                n: 参与排序的数据个数（2~255）
//函数返回：无
//函数调用示例：
//   MPSort(a, 5);         //对实参数组a中的5个数据由小到大排序
//=======================================================================
void MPSort(uint16 b[ ], uint8 n); 

//=======================================================================
//函数名称：datas_ave
//函数功能：计算多个数据的平均值
//函数参数：b[ ]: 用于接收实参数组的首地址（可用实参数组名作为函数实参）
//                n: 参与计算的数据个数（2~255）
//函数返回：多个数据的平均值
//函数调用示例：
//     datas_ave(a, 5);     //计算并得到实参数组a中5个数据的平均值
//=======================================================================
uint16 datas_ave(uint16 b[ ], uint8 n);

//=======================================================================
//函数名称：datas_mid
//函数功能：计算多个数据的中值
//函数参数：b[ ]: 用于接收实参数组的首地址（可用实参数组名作为函数实参）
//                n: 参与计算的数据个数（2~255）
//函数返回：多个数据的中值
//函数调用示例：
//     datas_mid(a, 5);     //计算并得到实参数组a中5个数据的中值
//=======================================================================
uint16 datas_mid(uint16 b[ ], uint8 n);

#endif              //防止重复定义（结尾）
